package com.my.code.sort;

import java.util.Arrays;

/**
 * <b>计数排序</b><p>
 * 计数排序的核心思想是将输入的数据值转化为键存储再额外开辟的数组空间中。
 * 计数排序要求输入的数据必需是确定范围的整数。
 *
 * @author zzl
 * @date 2020/10/19
 */
public class CountSort {

    public static void main(String[] args) {
        int[] arr = {5, 7, 1, 6, 4, 8, 3, 2};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr) {
        int min = arr[0], max = arr[0];
        for (int val : arr) {
            if (val > max) max = val;
            if (val < min) min = val;
        }

        int[] bucket = new int[max - min + 1];
        Arrays.fill(bucket, 0);

        for (int val : arr) {
            bucket[val - min]++;
        }

        int index = 0, i = 0;
        while (index < arr.length) {
            if (bucket[i] != 0) {
                arr[index] = i + min;
                bucket[i]--;
                index++;
            } else i++;
        }

    }

}
